home *** CD-ROM | disk | FTP | other *** search
/ Aminet 51 / Aminet 51 (2002)(GTI - Schatztruhe)[!][Oct 2002].iso / Aminet / util / misc / ReportPlus.lha / reportplus / source / f4.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-08-23  |  67.3 KB  |  1,641 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <proto/exec.h>
  4. #include <intuition/intuition.h>
  5. #include <intuition/gadgetclass.h>
  6. #include <proto/intuition.h>
  7. #include <libraries/gadtools.h>
  8. #include <proto/gadtools.h>
  9.  
  10. #include <ctype.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include "rp.h"
  14.  
  15. #define ALL_REACTION_CLASSES
  16. #include <reaction/reaction.h>
  17. #include <clib/texteditor_protos.h>
  18. #include <gadgets/texteditor.h>
  19. #include <pragmas/texteditor_pragmas.h>
  20.  
  21. #define MAXELEMENTS_4 14 // counting from 0
  22.  
  23. MODULE void bizarre(void);
  24. MODULE void updateautodocgadgets(void);
  25. MODULE void readautodocgadgets(void);
  26. MODULE void starify(STRPTR buffer);
  27. MODULE void destarify(STRPTR buffer);
  28. MODULE ULONG parseeither(STRPTR terminator1, STRPTR terminator2);
  29. MODULE void numberofinputs(void);
  30.  
  31. MODULE UBYTE*               StarBufferPtr = NULL;
  32. MODULE ULONG                elements,
  33.                             returncode,
  34.                             inputs;
  35. MODULE struct Gadget*       autodoc_gadgets[GIDS_4 + 1];
  36.  
  37. AGLOBAL struct AutodocStruct autodoc;
  38.  
  39. IMPORT struct Menu*        MenuPtr;
  40. IMPORT Object*             WinObject[FUNCTIONS + 1];
  41. IMPORT struct Screen*      ScreenPtr;
  42. IMPORT struct Window*      MainWindowPtr;
  43. IMPORT struct SharedStruct shared;
  44. IMPORT struct Library*     TextEditorBase;
  45.  
  46. IMPORT SBYTE               page;
  47. IMPORT TEXT                aslresult[MEDFIELD + 1],
  48.                            IOBuffer[LONGESTFIELD + 1],
  49.                            string[LONGESTFIELD + 1];
  50. IMPORT ULONG               offset;
  51.  
  52. AGLOBAL void autodoc1(void)
  53. {   struct Hook Hook4Struct;
  54.  
  55.     InitHook(&Hook4Struct, Hook4Func, NULL);
  56.  
  57.     /* Create the window object. */
  58.     lockscreen();
  59.  
  60.     if (!(WinObject[4] =
  61.     NewObject
  62.     (   WINDOW_GetClass(),            NULL,
  63.         WA_PubScreen,                 ScreenPtr,
  64.         WA_ScreenTitle,               "Report+",
  65.         WA_Title,                     "Report+: Autodoc Editor (Page 1 of 2)",
  66.         WA_Activate,                  TRUE,
  67.         WA_DepthGadget,               TRUE,
  68.         WA_DragBar,                   TRUE,
  69.         WA_CloseGadget,               TRUE,
  70.         WA_SizeGadget,                TRUE,
  71.         WA_IDCMP,                     IDCMP_RAWKEY,
  72.         WINDOW_IDCMPHook,             &Hook4Struct,
  73.         WINDOW_IDCMPHookBits,         IDCMP_RAWKEY,
  74.         WINDOW_MenuStrip,             MenuPtr,
  75.         WINDOW_Position,              WPOS_CENTERSCREEN,
  76.         WINDOW_ParentGroup,           autodoc_gadgets[GID_4_LY1] =
  77.         NewObject
  78.         (   LAYOUT_GetClass(), NULL,
  79.             // root-layout
  80.             LAYOUT_Orientation,        LAYOUT_ORIENT_VERT,
  81.             LAYOUT_SpaceOuter,         TRUE,
  82.             LAYOUT_DeferLayout,        TRUE,
  83.             LAYOUT_AddChild,
  84.             NewObject
  85.             (   LAYOUT_GetClass(),     NULL,
  86.                 LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  87.                 LAYOUT_SpaceOuter,     TRUE,
  88.                 LAYOUT_VertAlignment,  LALIGN_CENTER,
  89.                 LAYOUT_HorizAlignment, LALIGN_CENTER,
  90.                 LAYOUT_BevelStyle,     BVS_FIELD,
  91.                 LAYOUT_AddChild,
  92.                 NewObject
  93.                 (   LAYOUT_GetClass(),     NULL,
  94.                     LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  95.                     LAYOUT_SpaceOuter,     TRUE,
  96.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  97.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  98.                     LAYOUT_BevelStyle,     BVS_NONE,
  99.                     LAYOUT_AddImage,
  100.                     NewObject
  101.                     (   LABEL_GetClass(),  NULL,
  102.                         LABEL_Text,        "modulename._type:",
  103.                         LABEL_Justification,LJ_LEFT,
  104.                     TAG_END),
  105.                     CHILD_WeightedHeight,  0,
  106.                     LAYOUT_AddImage,
  107.                     NewObject
  108.                     (   LABEL_GetClass(),  NULL,
  109.                         LABEL_Text,        "Function_Name:",
  110.                         LABEL_Justification,LJ_LEFT,
  111.                     TAG_END),
  112.                     CHILD_WeightedHeight,  0,
  113.                     LAYOUT_AddImage,
  114.                     NewObject
  115.                     (   LABEL_GetClass(),  NULL,
  116.                         LABEL_Text,        "_Description:",
  117.                         LABEL_Justification,LJ_LEFT,
  118.                     TAG_END),
  119.                     CHILD_WeightedHeight,   0,
  120.                 TAG_END),
  121.                 CHILD_WeightedWidth,       0,
  122.                 LAYOUT_AddChild,
  123.                 NewObject
  124.                 (   LAYOUT_GetClass(),     NULL,
  125.                     LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  126.                     LAYOUT_SpaceOuter,     TRUE,
  127.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  128.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  129.                     LAYOUT_BevelStyle,     BVS_NONE,
  130.                     LAYOUT_AddChild,
  131.                     NewObject
  132.                     (   LAYOUT_GetClass(),     NULL,
  133.                         LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  134.                         LAYOUT_SpaceOuter,     TRUE,
  135.                         LAYOUT_VertAlignment,  LALIGN_CENTER,
  136.                         LAYOUT_HorizAlignment, LALIGN_CENTER,
  137.                         LAYOUT_BevelStyle,     BVS_NONE,
  138.                         LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST1] =
  139.                         NewObject
  140.                         (   STRING_GetClass(), NULL,
  141.                             GA_ID,             GID_4_ST1,
  142.                             GA_RelVerify,      TRUE,
  143.                             GA_TabCycle,       TRUE,
  144.                             STRINGA_TextVal,   autodoc.library,
  145.                             STRINGA_MinVisible,10,
  146.                             STRINGA_MaxChars,  MEDFIELD,
  147.                         TAG_END),
  148.                         CHILD_WeightedWidth,   50,
  149.                         LAYOUT_AddImage,
  150.                         NewObject
  151.                         (   LABEL_GetClass(),  NULL,
  152.                             LABEL_Text,        "Minimum _version:",
  153.                             LABEL_Justification,LJ_LEFT,
  154.                         TAG_END),
  155.                         CHILD_WeightedWidth,   0,
  156.                         LAYOUT_AddChild,       autodoc_gadgets[GID_4_IN1] =
  157.                         NewObject
  158.                         (   INTEGER_GetClass(),   NULL,
  159.                             GA_ID,                GID_4_IN1,
  160.                             GA_RelVerify,         TRUE,
  161.                             GA_TabCycle,          TRUE,
  162.                             INTEGER_Number,       autodoc.version,
  163.                             INTEGER_Minimum,      0, // ULONG (maximum value is (2^32) - 1)
  164.                             INTEGER_MinVisible,   5,
  165.                             TAG_END
  166.                         ),                                      
  167.                         CHILD_WeightedWidth,      50,
  168.                     TAG_END),
  169.                     CHILD_WeightedHeight,      0,
  170.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST2] =
  171.                     NewObject
  172.                     (   STRING_GetClass(), NULL,
  173.                         GA_ID,             GID_4_ST2,
  174.                         GA_RelVerify,      TRUE,
  175.                         GA_TabCycle,       TRUE,
  176.                         STRINGA_TextVal,   autodoc.funcname,
  177.                         STRINGA_MinVisible,20,
  178.                         STRINGA_MaxChars,  MEDFIELD,
  179.                     TAG_END),
  180.                     CHILD_WeightedHeight,  0,
  181.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST3] =
  182.                     NewObject
  183.                     (   STRING_GetClass(), NULL,
  184.                         GA_ID,             GID_4_ST3,
  185.                         GA_RelVerify,      TRUE,
  186.                         GA_TabCycle,       TRUE,
  187.                         STRINGA_TextVal,   autodoc.description,
  188.                         STRINGA_MinVisible,20,
  189.                         STRINGA_MaxChars,  VLONGFIELD,
  190.                     TAG_END),
  191.                     CHILD_WeightedHeight,  0,
  192.                 TAG_END),
  193.                 CHILD_WeightedWidth,       100,
  194.             TAG_END),
  195.             CHILD_WeightedHeight,          0,
  196.             LAYOUT_AddChild,
  197.             NewObject
  198.             (   LAYOUT_GetClass(),     NULL,
  199.                 LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  200.                 LAYOUT_SpaceOuter,     TRUE,
  201.                 LAYOUT_VertAlignment,  LALIGN_LEFT,
  202.                 LAYOUT_HorizAlignment, LALIGN_RIGHT,
  203.                 LAYOUT_BevelStyle,     BVS_NONE,
  204.                 LAYOUT_AddChild,
  205.                 NewObject
  206.                 (   LAYOUT_GetClass(),     NULL,
  207.                     LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  208.                     LAYOUT_SpaceOuter,     TRUE,
  209.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  210.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  211.                     LAYOUT_BevelStyle,     BVS_NONE,
  212.                     LAYOUT_AddImage,
  213.                     NewObject
  214.                     (   LABEL_GetClass(),  NULL,
  215.                         LABEL_Text,        "",
  216.                         LABEL_Justification,LJ_CENTER,
  217.                     TAG_END),
  218.                     LAYOUT_AddImage,
  219.                     NewObject
  220.                     (   LABEL_GetClass(),  NULL,
  221.                         LABEL_Text,        "_Return code:",
  222.                         LABEL_Justification,LJ_CENTER,
  223.                     TAG_END),
  224.                     LAYOUT_AddImage,
  225.                     NewObject
  226.                     (   LABEL_GetClass(),  NULL,
  227.                         LABEL_Text,        "Argument _1:",
  228.                         LABEL_Justification,LJ_CENTER,
  229.                     TAG_END),
  230.                     LAYOUT_AddImage,
  231.                     NewObject
  232.                     (   LABEL_GetClass(),  NULL,
  233.                         LABEL_Text,        "Argument _2:",
  234.                         LABEL_Justification,LJ_CENTER,
  235.                     TAG_END),
  236.                     LAYOUT_AddImage,
  237.                     NewObject
  238.                     (   LABEL_GetClass(),  NULL,
  239.                         LABEL_Text,        "Argument _3:",
  240.                         LABEL_Justification,LJ_CENTER,
  241.                     TAG_END),
  242.                     LAYOUT_AddImage,
  243.                     NewObject
  244.                     (   LABEL_GetClass(),  NULL,
  245.                         LABEL_Text,        "Argument _4:",
  246.                         LABEL_Justification,LJ_CENTER,
  247.                     TAG_END),
  248.                     LAYOUT_AddImage,
  249.                     NewObject
  250.                     (   LABEL_GetClass(),  NULL,
  251.                         LABEL_Text,        "Argument _5:",
  252.                         LABEL_Justification,LJ_CENTER,
  253.                     TAG_END),
  254.                     LAYOUT_AddImage,
  255.                     NewObject
  256.                     (   LABEL_GetClass(),  NULL,
  257.                         LABEL_Text,        "Argument _6:",
  258.                         LABEL_Justification,LJ_CENTER,
  259.                     TAG_END),
  260.                     LAYOUT_AddImage,
  261.                     NewObject
  262.                     (   LABEL_GetClass(),  NULL,
  263.                         LABEL_Text,        "Argument _7:",
  264.                         LABEL_Justification,LJ_CENTER,
  265.                     TAG_END),
  266.                     LAYOUT_AddImage,
  267.                     NewObject
  268.                     (   LABEL_GetClass(),  NULL,
  269.                         LABEL_Text,        "Argument _8:",
  270.                         LABEL_Justification,LJ_CENTER,
  271.                     TAG_END),
  272.                 TAG_END),
  273.                 CHILD_WeightedWidth,       0,
  274.                 LAYOUT_AddChild,
  275.                 NewObject
  276.                 (   LAYOUT_GetClass(),     NULL,
  277.                     LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  278.                     LAYOUT_SpaceOuter,     TRUE,
  279.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  280.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  281.                     LAYOUT_BevelStyle,     BVS_NONE,
  282.                     LAYOUT_AddImage,
  283.                     NewObject
  284.                     (   LABEL_GetClass(),  NULL,
  285.                         LABEL_Text,        "Type",
  286.                         LABEL_Justification,LJ_CENTER,
  287.                     TAG_END),
  288.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST4] =
  289.                     NewObject
  290.                     (   STRING_GetClass(), NULL,
  291.                         GA_ID,             GID_4_ST4,
  292.                         GA_RelVerify,      TRUE,
  293.                         GA_TabCycle,       TRUE,
  294.                         STRINGA_TextVal,   autodoc.var[0].type,
  295.                         STRINGA_MinVisible,4,
  296.                         STRINGA_MaxChars,  MEDFIELD,
  297.                     TAG_END),
  298.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST5] =
  299.                     NewObject
  300.                     (   STRING_GetClass(), NULL,
  301.                         GA_ID,             GID_4_ST5,
  302.                         GA_RelVerify,      TRUE,
  303.                         GA_TabCycle,       TRUE,
  304.                         STRINGA_TextVal,   autodoc.var[1].type,
  305.                         STRINGA_MinVisible,4,
  306.                         STRINGA_MaxChars,  MEDFIELD,
  307.                     TAG_END),
  308.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST6] =
  309.                     NewObject
  310.                     (   STRING_GetClass(), NULL,
  311.                         GA_ID,             GID_4_ST6,
  312.                         GA_RelVerify,      TRUE,
  313.                         GA_TabCycle,       TRUE,
  314.                         STRINGA_TextVal,   autodoc.var[2].type,
  315.                         STRINGA_MinVisible,4,
  316.                         STRINGA_MaxChars,  MEDFIELD,
  317.                     TAG_END),
  318.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST7] =
  319.                     NewObject
  320.                     (   STRING_GetClass(), NULL,
  321.                         GA_ID,             GID_4_ST7,
  322.                         GA_RelVerify,      TRUE,
  323.                         GA_TabCycle,       TRUE,
  324.                         STRINGA_TextVal,   autodoc.var[3].type,
  325.                         STRINGA_MinVisible,4,
  326.                         STRINGA_MaxChars,  MEDFIELD,
  327.                     TAG_END),
  328.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST8] =
  329.                     NewObject
  330.                     (   STRING_GetClass(), NULL,
  331.                         GA_ID,             GID_4_ST8,
  332.                         GA_RelVerify,      TRUE,
  333.                         GA_TabCycle,       TRUE,
  334.                         STRINGA_TextVal,   autodoc.var[4].type,
  335.                         STRINGA_MinVisible,4,
  336.                         STRINGA_MaxChars,  MEDFIELD,
  337.                     TAG_END),
  338.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST9] =
  339.                     NewObject
  340.                     (   STRING_GetClass(), NULL,
  341.                         GA_ID,             GID_4_ST9,
  342.                         GA_RelVerify,      TRUE,
  343.                         GA_TabCycle,       TRUE,
  344.                         STRINGA_TextVal,   autodoc.var[5].type,
  345.                         STRINGA_MinVisible,4,
  346.                         STRINGA_MaxChars,  MEDFIELD,
  347.                     TAG_END),
  348.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST10] =
  349.                     NewObject
  350.                     (   STRING_GetClass(), NULL,
  351.                         GA_ID,             GID_4_ST10,
  352.                         GA_RelVerify,      TRUE,
  353.                         GA_TabCycle,       TRUE,
  354.                         STRINGA_TextVal,   autodoc.var[6].type,
  355.                         STRINGA_MinVisible,4,
  356.                         STRINGA_MaxChars,  MEDFIELD,
  357.                     TAG_END),
  358.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST11] =
  359.                     NewObject
  360.                     (   STRING_GetClass(), NULL,
  361.                         GA_ID,             GID_4_ST11,
  362.                         GA_RelVerify,      TRUE,
  363.                         GA_TabCycle,       TRUE,
  364.                         STRINGA_TextVal,   autodoc.var[7].type,
  365.                         STRINGA_MinVisible,4,
  366.                         STRINGA_MaxChars,  MEDFIELD,
  367.                     TAG_END),
  368.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST12] =
  369.                     NewObject
  370.                     (   STRING_GetClass(), NULL,
  371.                         GA_ID,             GID_4_ST12,
  372.                         GA_RelVerify,      TRUE,
  373.                         GA_TabCycle,       TRUE,
  374.                         STRINGA_TextVal,   autodoc.var[8].type,
  375.                         STRINGA_MinVisible,4,
  376.                         STRINGA_MaxChars,  MEDFIELD,
  377.                     TAG_END),
  378.                 TAG_END),
  379.                 CHILD_WeightedWidth,       35,
  380.                 LAYOUT_AddChild,
  381.                 NewObject
  382.                 (   LAYOUT_GetClass(),     NULL,
  383.                     LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  384.                     LAYOUT_SpaceOuter,     TRUE,
  385.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  386.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  387.                     LAYOUT_BevelStyle,     BVS_NONE,
  388.                     LAYOUT_AddImage,
  389.                     NewObject
  390.                     (   LABEL_GetClass(),  NULL,
  391.                         LABEL_Text,        "Name",
  392.                         LABEL_Justification,LJ_CENTER,
  393.                     TAG_END),
  394.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST13] =
  395.                     NewObject
  396.                     (   STRING_GetClass(), NULL,
  397.                         GA_ID,             GID_4_ST13,
  398.                         GA_RelVerify,      TRUE,
  399.                         GA_TabCycle,       TRUE,
  400.                         STRINGA_TextVal,   autodoc.var[0].name,
  401.                         STRINGA_MinVisible,4,
  402.                         STRINGA_MaxChars,  MEDFIELD,
  403.                     TAG_END),
  404.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST14] =
  405.                     NewObject
  406.                     (   STRING_GetClass(), NULL,
  407.                         GA_ID,             GID_4_ST14,
  408.                         GA_RelVerify,      TRUE,
  409.                         GA_TabCycle,       TRUE,
  410.                         STRINGA_TextVal,   autodoc.var[1].name,
  411.                         STRINGA_MinVisible,4,
  412.                         STRINGA_MaxChars,  MEDFIELD,
  413.                     TAG_END),
  414.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST15] =
  415.                     NewObject
  416.                     (   STRING_GetClass(), NULL,
  417.                         GA_ID,             GID_4_ST15,
  418.                         GA_RelVerify,      TRUE,
  419.                         GA_TabCycle,       TRUE,
  420.                         STRINGA_TextVal,   autodoc.var[2].name,
  421.                         STRINGA_MinVisible,4,
  422.                         STRINGA_MaxChars,  MEDFIELD,
  423.                     TAG_END),
  424.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST16] =
  425.                     NewObject
  426.                     (   STRING_GetClass(), NULL,
  427.                         GA_ID,             GID_4_ST16,
  428.                         GA_RelVerify,      TRUE,
  429.                         GA_TabCycle,       TRUE,
  430.                         STRINGA_TextVal,   autodoc.var[3].name,
  431.                         STRINGA_MinVisible,4,
  432.                         STRINGA_MaxChars,  MEDFIELD,
  433.                     TAG_END),
  434.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST17] =
  435.                     NewObject
  436.                     (   STRING_GetClass(), NULL,
  437.                         GA_ID,             GID_4_ST17,
  438.                         GA_RelVerify,      TRUE,
  439.                         GA_TabCycle,       TRUE,
  440.                         STRINGA_TextVal,   autodoc.var[4].name,
  441.                         STRINGA_MinVisible,4,
  442.                         STRINGA_MaxChars,  MEDFIELD,
  443.                     TAG_END),
  444.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST18] =
  445.                     NewObject
  446.                     (   STRING_GetClass(), NULL,
  447.                         GA_ID,             GID_4_ST18,
  448.                         GA_RelVerify,      TRUE,
  449.                         GA_TabCycle,       TRUE,
  450.                         STRINGA_TextVal,   autodoc.var[5].name,
  451.                         STRINGA_MinVisible,4,
  452.                         STRINGA_MaxChars,  MEDFIELD,
  453.                     TAG_END),
  454.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST19] =
  455.                     NewObject
  456.                     (   STRING_GetClass(), NULL,
  457.                         GA_ID,             GID_4_ST19,
  458.                         GA_RelVerify,      TRUE,
  459.                         GA_TabCycle,       TRUE,
  460.                         STRINGA_TextVal,   autodoc.var[6].name,
  461.                         STRINGA_MinVisible,4,
  462.                         STRINGA_MaxChars,  MEDFIELD,
  463.                     TAG_END),
  464.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST20] =
  465.                     NewObject
  466.                     (   STRING_GetClass(), NULL,
  467.                         GA_ID,             GID_4_ST20,
  468.                         GA_RelVerify,      TRUE,
  469.                         GA_TabCycle,       TRUE,
  470.                         STRINGA_TextVal,   autodoc.var[7].name,
  471.                         STRINGA_MinVisible,4,
  472.                         STRINGA_MaxChars,  MEDFIELD,
  473.                     TAG_END),
  474.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST21] =
  475.                     NewObject
  476.                     (   STRING_GetClass(), NULL,
  477.                         GA_ID,             GID_4_ST21,
  478.                         GA_RelVerify,      TRUE,
  479.                         GA_TabCycle,       TRUE,
  480.                         STRINGA_TextVal,   autodoc.var[8].name,
  481.                         STRINGA_MinVisible,4,
  482.                         STRINGA_MaxChars,  MEDFIELD,
  483.                     TAG_END),
  484.                 TAG_END),
  485.                 CHILD_WeightedWidth,       45,
  486.                 LAYOUT_AddChild,
  487.                 NewObject
  488.                 (   LAYOUT_GetClass(),     NULL,
  489.                     LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  490.                     LAYOUT_SpaceOuter,     TRUE,
  491.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  492.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  493.                     LAYOUT_BevelStyle,     BVS_NONE,
  494.                     LAYOUT_AddImage,
  495.                     NewObject
  496.                     (   LABEL_GetClass(),  NULL,
  497.                         LABEL_Text,        "Register",
  498.                         LABEL_Justification,LJ_CENTER,
  499.                     TAG_END),
  500.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST22] =
  501.                     NewObject
  502.                     (   STRING_GetClass(), NULL,
  503.                         GA_ID,             GID_4_ST22,
  504.                         GA_RelVerify,      TRUE,
  505.                         GA_TabCycle,       TRUE,
  506.                         STRINGA_TextVal,   autodoc.var[0].reg,
  507.                         STRINGA_MinVisible,4,
  508.                         STRINGA_MaxChars,  MEDFIELD,
  509.                     TAG_END),
  510.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST23] =
  511.                     NewObject
  512.                     (   STRING_GetClass(), NULL,
  513.                         GA_ID,             GID_4_ST23,
  514.                         GA_RelVerify,      TRUE,
  515.                         GA_TabCycle,       TRUE,
  516.                         STRINGA_TextVal,   autodoc.var[1].reg,
  517.                         STRINGA_MinVisible,4,
  518.                         STRINGA_MaxChars,  MEDFIELD,
  519.                     TAG_END),
  520.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST24] =
  521.                     NewObject
  522.                     (   STRING_GetClass(), NULL,
  523.                         GA_ID,             GID_4_ST24,
  524.                         GA_RelVerify,      TRUE,
  525.                         GA_TabCycle,       TRUE,
  526.                         STRINGA_TextVal,   autodoc.var[2].reg,
  527.                         STRINGA_MinVisible,4,
  528.                         STRINGA_MaxChars,  MEDFIELD,
  529.                     TAG_END),
  530.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST25] =
  531.                     NewObject
  532.                     (   STRING_GetClass(), NULL,
  533.                         GA_ID,             GID_4_ST25,
  534.                         GA_RelVerify,      TRUE,
  535.                         GA_TabCycle,       TRUE,
  536.                         STRINGA_TextVal,   autodoc.var[3].reg,
  537.                         STRINGA_MinVisible,4,
  538.                         STRINGA_MaxChars,  MEDFIELD,
  539.                     TAG_END),
  540.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST26] =
  541.                     NewObject
  542.                     (   STRING_GetClass(), NULL,
  543.                         GA_ID,             GID_4_ST26,
  544.                         GA_RelVerify,      TRUE,
  545.                         GA_TabCycle,       TRUE,
  546.                         STRINGA_TextVal,   autodoc.var[4].reg,
  547.                         STRINGA_MinVisible,4,
  548.                         STRINGA_MaxChars,  MEDFIELD,
  549.                     TAG_END),
  550.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST27] =
  551.                     NewObject
  552.                     (   STRING_GetClass(), NULL,
  553.                         GA_ID,             GID_4_ST27,
  554.                         GA_RelVerify,      TRUE,
  555.                         GA_TabCycle,       TRUE,
  556.                         STRINGA_TextVal,   autodoc.var[5].reg,
  557.                         STRINGA_MinVisible,4,
  558.                         STRINGA_MaxChars,  MEDFIELD,
  559.                     TAG_END),
  560.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST28] =
  561.                     NewObject
  562.                     (   STRING_GetClass(), NULL,
  563.                         GA_ID,             GID_4_ST28,
  564.                         GA_RelVerify,      TRUE,
  565.                         GA_TabCycle,       TRUE,
  566.                         STRINGA_TextVal,   autodoc.var[6].reg,
  567.                         STRINGA_MinVisible,4,
  568.                         STRINGA_MaxChars,  MEDFIELD,
  569.                     TAG_END),
  570.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST29] =
  571.                     NewObject
  572.                     (   STRING_GetClass(), NULL,
  573.                         GA_ID,             GID_4_ST29,
  574.                         GA_RelVerify,      TRUE,
  575.                         GA_TabCycle,       TRUE,
  576.                         STRINGA_TextVal,   autodoc.var[7].reg,
  577.                         STRINGA_MinVisible,4,
  578.                         STRINGA_MaxChars,  MEDFIELD,
  579.                     TAG_END),
  580.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST30] =
  581.                     NewObject
  582.                     (   STRING_GetClass(), NULL,
  583.                         GA_ID,             GID_4_ST30,
  584.                         GA_RelVerify,      TRUE,
  585.                         GA_TabCycle,       TRUE,
  586.                         STRINGA_TextVal,   autodoc.var[8].reg,
  587.                         STRINGA_MinVisible,4,
  588.                         STRINGA_MaxChars,  MEDFIELD,
  589.                     TAG_END),
  590.                 TAG_END),
  591.                 CHILD_WeightedWidth,       20,
  592.             TAG_END),
  593.             CHILD_WeightedHeight,      0,
  594.             LAYOUT_AddChild,          autodoc_gadgets[GID_4_BU1] =
  595.             NewObject
  596.             (   NULL,                 "button.gadget",
  597.                 // button
  598.                 GA_ID,                GID_4_BU1,
  599.                 GA_RelVerify,         TRUE,
  600.                 GA_Text,              "_Other page...",
  601.             TAG_END),
  602.             CHILD_WeightedHeight,         0,
  603.         TAG_END
  604.     ))))
  605.     {   rq("Can't create ReAction objects!");
  606.     }
  607.     unlockscreen();
  608.     openwindow();
  609.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_NEW,    NOSUB));
  610.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_OPEN,   NOSUB));
  611.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVE,   NOSUB));
  612.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVEAS, NOSUB));
  613.     ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_ST1]);
  614.  
  615.     loop();
  616.     closewindow();
  617. }
  618.  
  619. AGLOBAL void saveautodoc(ABOOL saveas)
  620. {   ULONG i, j;
  621.     TEXT  temp[MEDFIELD + 1];
  622.     SWORD size;
  623.  
  624.     readautodocgadgets();
  625.    
  626.     strcpy(IOBuffer, "/" "****** ");        //  1:  "/###### "
  627.     strcat(IOBuffer, autodoc.library);      //  1:  "/###### <library>"
  628.     strcat(IOBuffer, "/");                  //  1:  "/###### <library>/"
  629.     strcat(IOBuffer, autodoc.funcname);     //  1:  "/###### <library>/<funcname>"
  630.     strcat(IOBuffer, " ");                  //  1:  "/###### <library>/<funcname> "
  631.  
  632.     size = 67 - strlen(autodoc.library) - strlen(autodoc.funcname);
  633.     if (size > 0)
  634.     {   for (i = 1; i <= size; i++)           
  635.             strcat(IOBuffer, "*");          //  1:  "/###### <library>/<funcname> <stars>"
  636.     }
  637.  
  638.     strcat(IOBuffer, "\n*\n*   NAME\n*   ");
  639.                                             //  1:  "/###### <library>/<funcname> <stars>\n"
  640.                                             //  2:  "#\n"
  641.                                             //  3:  "#   NAME\n"
  642.                                             //  4:  "#   "
  643.     strcat(IOBuffer, autodoc.funcname);     //  4:  "#   <funcname>"
  644.     strcat(IOBuffer, " -- ");               //  4:  "#   <funcname> -- "
  645.     strcat(IOBuffer, autodoc.description);
  646.                                             //  4:  "#   <funcname> -- <description>"
  647.     if (autodoc.version)
  648.     {   strcat(IOBuffer, " (V");            //  4:  "#   <funcname> -- <description>[ (V]"
  649.         stcl_d(temp, autodoc.version);
  650.         strcat(IOBuffer, temp);             //  4:  "#   <funcname> -- <description>[ (V<version>]"
  651.         strcat(IOBuffer, ")");              //  4:  "#   <funcname> -- <description>[ (V<version>)]
  652.     }
  653.     strcat(IOBuffer, "\n*\n*   SYNOPSIS\n");
  654.                                             //  4:  "#   <funcname> -- <description>[ (V<version>)]\n"
  655.                                             //  5:  "#\n"
  656.                                             //  6:  "#   SYNOPSIS\n"
  657.  
  658.     // name line
  659.     strcat(IOBuffer, "*   ");               //  7:  "#   "
  660.     if (autodoc.var[0].name[0])
  661.     {   strcat(IOBuffer, autodoc.var[0].name);
  662.                                             //  7:  "#   [<returnname>]"
  663.         strcat(IOBuffer, " = ");            //  7:  "#   [<returnname> = ]"
  664.     }
  665.     strcat(IOBuffer, autodoc.funcname);     //  7:  "#   [<returnname> = ]<funcname>"
  666.     strcat(IOBuffer, "(");                  //  7:  "#   [<returnname> = ]<funcname>("
  667.  
  668.     for (i = 1; i <= 8; i++)
  669.     {   if (autodoc.var[i].name[0])
  670.         {   if (i >= 2)
  671.                 strcat(IOBuffer, ", ");
  672.             strcat(IOBuffer, autodoc.var[i].name);
  673.             size = strlen(autodoc.var[i].reg) - strlen(autodoc.var[i].name);
  674.             if (size > 0)
  675.                 for (j = 1; j <= size; j++)
  676.                     strcat(IOBuffer, " ");
  677.         } else break;
  678.     }
  679.     strcat(IOBuffer, ")\n");                //  7:  "#   [<returnname> = ]<funcname>([<arglist>])\n"
  680.  
  681.     // register line
  682.     strcat(IOBuffer, "*   ");               //  8:  "#   "
  683.     if (autodoc.var[0].reg[0] && autodoc.var[0].name[0])
  684.     {   strcat(IOBuffer, autodoc.var[0].reg);
  685.                                             //  8:  "#   [<returnreg>]"
  686.         size = strlen(autodoc.var[0].name) - strlen(autodoc.var[0].reg);
  687.         if (size > 0)
  688.             for (i = 1; i <= size; i++)
  689.                 strcat(IOBuffer, " ");      //  8:  "#   [<returnreg><spaces>]"
  690.         strcat(IOBuffer, "   ");            //  8:  "#   [<returnreg><spaces>   ]"
  691.     }
  692.     size = strlen(autodoc.funcname);
  693.     if (size >= 0) // this is no mistake
  694.         for (i = 0; i <= size; i++)
  695.             strcat(IOBuffer, " ");          //  8:  "#   [<returnreg><spaces>   ]<spaces>"
  696.  
  697.     for (i = 1; i <= 8; i++)
  698.     {   if (autodoc.var[i].reg[0])
  699.         {   if (i >= 2)
  700.                 strcat(IOBuffer, "  ");
  701.             strcat(IOBuffer, autodoc.var[i].reg);
  702.             size = strlen(autodoc.var[i].name) - strlen(autodoc.var[i].reg);
  703.             if (size > 0)
  704.                 for (j = 1; j <= size; j++)
  705.                     strcat(IOBuffer, " ");
  706.     }   }
  707.     strcat(IOBuffer, "\n");                 //  8:  "#   [<returnreg><spaces>   ]<spaces>[<reglist>]\n"
  708.  
  709.     strcat(IOBuffer, "*\n*   ");            //  9:  "#\n"
  710.                                             // 10:  "#   "
  711.     if (autodoc.var[0].type[0])
  712.     {   strcat(IOBuffer, autodoc.var[0].type);
  713.                                             // 10a: "#   <returntype>"
  714.         strcat(IOBuffer, " ");              // 10a: "#   <returntype> "
  715.     } else
  716.         strcat(IOBuffer, "void ");          // 10b: "#   void "
  717.     strcat(IOBuffer, autodoc.funcname);     // 10:  "#   <returntype>|void <funcname>"
  718.     strcat(IOBuffer, "(");                  // 10:  "#   <returntype>|void <funcname>("
  719.     if (!(autodoc.var[1].type))             // 10:  "#   <returntype>|void <funcname>([void]"
  720.         strcat(IOBuffer, "void");
  721.     else
  722.     {   for (i = 1; i <= 8; i++)
  723.         {   if (autodoc.var[i].type[0])
  724.             {   if (i >= 2)
  725.                     strcat(IOBuffer, ", ");
  726.                 strcat(IOBuffer, autodoc.var[i].type);
  727.             } else break;
  728.     }   }
  729.     strcat(IOBuffer, ");\n*\n*   FUNCTION\n*   ");
  730.                                             // 10:  "#   <returntype>|void <funcname>(void|<typelist>);\n"
  731.                                             // 11:  "#\n"
  732.                                             // 12:  "#   FUNCTION\n"
  733.                                             // 13:  "#   "
  734.     starify(autodoc.function);
  735.     strcat(IOBuffer, StarBufferPtr);        // 13:  "#   <buffer>"
  736.     FreeVec(StarBufferPtr);
  737.  
  738.     strcat(IOBuffer, "\n*\n*   INPUTS\n");  // 13:  "#   <buffer>\n"
  739.                                             // 14:  "#\n"
  740.                                             // 15:  "#   INPUTS\n"
  741.  
  742.     bizarre();
  743.  
  744.     strcat(IOBuffer, "*\n*   RESULT\n*   ");
  745.                                             // 17:  "#\n"
  746.                                             // 18:  "#   RESULT\n"
  747.                                             // 19:  "#   "
  748.     if (!(autodoc.var[0].name[0]))
  749.     {   strcat(IOBuffer, "NONE");           // 19a: "#   NONE"
  750.     } else
  751.     {   strcat(IOBuffer, autodoc.var[0].name);
  752.                                             // 19b: "#   <returnname>"
  753.         strcat(IOBuffer, " - ");            // 19b: "#   <returnname> - "
  754.  
  755.         starify(autodoc.var[0].desc);
  756.         strcat(IOBuffer, StarBufferPtr);    // 19b: "#   <returnname> - <buffer>"
  757.         FreeVec(StarBufferPtr);
  758.     }
  759.  
  760.     strcat
  761.     (   IOBuffer,
  762.         "\n*\n"                             // 19a: "#   NONE\n"
  763.                                             // 19b: "#   <returnname> - <buffer>\n"
  764.                                             // 20:  "#\n"
  765.         "*   EXAMPLE\n*   "                 // 21:  "#   EXAMPLE\n"
  766.                                             // 22:  "#   "
  767.     );
  768.  
  769.     starify(autodoc.example);
  770.     strcat(IOBuffer, StarBufferPtr);        // 22:  "#   <buffer>"
  771.     FreeVec(StarBufferPtr);
  772.     strcat(IOBuffer, "\n*\n*   NOTES\n*   ");
  773.                                             // 22:  "#   <buffer>\n"
  774.                                             // 23:  "#\n"
  775.                                             // 24:  "#   NOTES\n"
  776.                                             // 25:  "#   "
  777.     starify(autodoc.notes);
  778.     strcat(IOBuffer, StarBufferPtr);        // 25:  "#   <buffer>"
  779.     FreeVec(StarBufferPtr);
  780.     strcat(IOBuffer, "\n*\n*   BUGS\n*   ");
  781.                                             // 25:  "#   <buffer>\n"
  782.                                             // 26:  "#\n"
  783.                                             // 27:  "#   BUGS\n"
  784.                                             // 28:  "#   "
  785.     starify(autodoc.bugs);
  786.     strcat(IOBuffer, StarBufferPtr);        // 28:  "#   <buffer>"
  787.     FreeVec(StarBufferPtr);
  788.     strcat(IOBuffer, "\n*\n*   SEE ALSO\n*   ");
  789.                                             // 28:  "#   <buffer>\n"
  790.                                             // 29:  "#\n"
  791.                                             // 30:  "#   SEE ALSO\n"
  792.                                             // 31:  "#   "
  793.     starify(autodoc.seealso);
  794.     strcat(IOBuffer, StarBufferPtr);        // 31:  "#   <buffer>"
  795.     FreeVec(StarBufferPtr);
  796.  
  797.     strcat
  798.     (   IOBuffer,
  799.         "\n*\n"                             // 31:  "#   <buffer>\n"
  800.                                             // 32:  "#\n"
  801.         "*****************************************************************************\n"
  802.                                             // 33:  "<77 stars>\n"
  803.         "*\n*"                              // 34:  "#\n"
  804.                                             // 35:  "#"
  805.         "/\n"                               // 35:  "#/\n"
  806.     );
  807.  
  808.     if (!autodoc.output[0] || saveas) // if we need a filename
  809.     {   if (saveasl("Save Autodoc", "#?.c"))
  810.         {   strcpy(autodoc.output, aslresult);
  811.             writeout(autodoc.output);
  812.     }   }
  813.     else
  814.     {   writeout(autodoc.output);
  815. }   }
  816.  
  817. MODULE void bizarre(void)
  818. {   ULONG i, j;
  819.     SWORD size, longest = 0, thislength; // must be signed
  820.     TEXT  line[VLONGFIELD + 1]; // better not make it too large, as it is
  821.                                 // a local (stack) variable.
  822.  
  823.     numberofinputs();
  824.     if (!inputs)
  825.     {   strcpy(line, "*   NONE\n");         // 16:  "#   NONE\n"
  826.     } else
  827.     {   for (i = 1; i <= inputs; i++)
  828.         {   thislength = strlen(autodoc.var[i].name);
  829.             if (thislength > longest)
  830.             {   longest = thislength;
  831.         }   }
  832.  
  833.         for (i = 1; i <= inputs; i++)
  834.         {   strcpy(line, "*   ");           // 16:  "#   "
  835.             strcat(line, autodoc.var[i].name);
  836.                                             // 16:  "#   <argname1>"
  837.             thislength = strlen(autodoc.var[i].name);
  838.             size = longest - thislength;
  839.             if (size > 0)
  840.             {   for (j = 1; j <= size; j++)
  841.                 {    strcat(line, " ");     // 16:  "#   <argname1><spaces>"
  842.             }   }
  843.             strcat(line, " - ");            // 16:  "#   <argname1><spaces> - "
  844.  
  845.             starify(autodoc.var[i].desc);
  846.             strcat(line, StarBufferPtr);
  847.             FreeVec(StarBufferPtr);                     // 16:  "#   <argname1><spaces> - <buffer1>"
  848.             strcat(line, "\n");             // 16:  "#   <argname1><spaces> - <buffer1>\n"
  849.             strcat(IOBuffer, line);
  850. }   }   }
  851.  
  852. AGLOBAL void newautodoc(ABOOL display)
  853. {   ULONG i;
  854.  
  855.     for (i = 0; i <= 8; i++)
  856.     {   autodoc.var[i].name[0] =
  857.         autodoc.var[i].type[0] =
  858.         autodoc.var[i].reg[0]  =
  859.         autodoc.var[i].desc[0] = 0;
  860.     }
  861.     autodoc.version        =
  862.     autodoc.library[0]     =
  863.     autodoc.funcname[0]    =
  864.     autodoc.description[0] =
  865.     autodoc.output[0]      =
  866.     autodoc.function[0]    =
  867.     autodoc.example[0]     =
  868.     autodoc.notes[0]       =
  869.     autodoc.bugs[0]        =
  870.     autodoc.seealso[0]     = 0;
  871.  
  872.     if (display)
  873.     {   updateautodocgadgets();
  874. }   }
  875.  
  876. AGLOBAL void openautodoc(void)
  877. {   if (asl("~(#?.info)"))
  878.     {   newautodoc(FALSE); // This line and the next are order-dependant
  879.         strcpy(autodoc.output, aslresult);
  880.         loadautodoc();
  881.         updateautodocgadgets();
  882. }   }
  883.  
  884. AGLOBAL void loadautodoc(void)
  885. {   ULONG counter, i, whatfound;
  886.  
  887.     /* parse() returns when it has moved along and found the specified
  888.        `ending string'. The contents, since last parse(), before the
  889.        `ending string' are returned in string. */
  890.  
  891.     if (readin(autodoc.output))
  892.     {   offset = 0;
  893.         parse("/" "****** "); // skip header
  894.  
  895.         // name
  896.         parse("/");
  897.         strcpy(autodoc.library, string);
  898.         parse(" ");
  899.         strcpy(autodoc.funcname, string);
  900.         parse("\n*\n*   NAME\n*   "); 
  901.  
  902.         // ignore that, skip all the asterisks
  903.         parse(" -- ");
  904.         // function name is repeated here
  905.         if (parseeither(" (V", "\n*\n*   SYNOPSIS\n*   ") == 1)
  906.         {   strcpy(autodoc.description, string);
  907.             parse(")\n*\n*   SYNOPSIS\n*   ");
  908.             autodoc.version = atol(string);
  909.         } else
  910.         {   strcpy(autodoc.description, string);
  911.         }
  912.  
  913.         // synopsis
  914.         if (parseeither(" = ", "(") == 1)
  915.         {   strcpy(autodoc.var[0].name, string);
  916.             parse("(");
  917.         }
  918.         // function name is repeated here
  919.         counter = 0;
  920.         while (whatfound = parseeither(", ", ")\n*   "))
  921.         {   if (string[0]) // in case we get () situation (ie. no args)
  922.             {   counter++;
  923.                 strcpy(autodoc.var[counter].name, string);
  924.             }
  925.             if (whatfound == 2)
  926.             {   break;
  927.         }   }
  928.         inputs = counter;
  929.         if (autodoc.var[0].name[0])
  930.         {   counter = 0;
  931.         } else counter = 1; // where to start
  932.         while (whatfound = parseeither(" ", "\n*\n*   "))
  933.         {   if (string[0])
  934.             {   strcpy(autodoc.var[counter].reg, string);
  935.                 counter++;
  936.             }
  937.             if (whatfound == 2)
  938.             {   break;
  939.         }   }
  940.         parse(" ");
  941.         strcpy(autodoc.var[0].type, string);
  942.         parse("(");
  943.         // function name is repeated here
  944.         counter = 0;
  945.         while (whatfound = parseeither(", ", ");\n*\n*   FUNCTION\n*   "))
  946.         {   if (string[0]) // in case we get () situation (ie. no args)
  947.             {   counter++;
  948.                 strcpy(autodoc.var[counter].type, string);
  949.             }
  950.             if (whatfound == 2)
  951.             {   break;
  952.         }   }
  953.         // function
  954.         parse("\n*\n*   INPUTS\n*   ");
  955.         destarify(string);
  956.         strcpy(autodoc.function, StarBufferPtr);
  957.         FreeVec(StarBufferPtr);
  958.  
  959.         // inputs
  960.         for (i = 1; i <= inputs; i++)
  961.         {   parse("   ");
  962.             parse(" -");
  963.             // input name is repeated here
  964.             if (parseeither(" ", "\n*") == 1)
  965.             {   parse("\n*");
  966.                 destarify(string);
  967.                 strcpy(autodoc.var[counter].desc, StarBufferPtr);
  968.                 FreeVec(StarBufferPtr);
  969.         }   } 
  970.         parse("\n*   RESULT\n*   ");
  971.  
  972.         // result
  973.         if (parseeither(" - ", "NONE\n*\n*   EXAMPLE\n*   ") == 1)
  974.         {   strcpy(autodoc.var[0].name, string);
  975.             parse("\n*\n*   EXAMPLE");
  976.             destarify(string);
  977.             strcpy(autodoc.var[0].desc, StarBufferPtr);
  978.             FreeVec(StarBufferPtr);
  979.             parseeither("\n*   ", "S\n*   "); // accepts either EXAMPLE or EXAMPLES
  980.         }
  981.  
  982.         // example
  983.         parse("\n*\n*   NOTES\n*   ");
  984.         destarify(string);
  985.         strcpy(autodoc.example, StarBufferPtr);
  986.         FreeVec(StarBufferPtr);
  987.  
  988.         // notes
  989.         parse("\n*\n*   BUGS\n*   ");
  990.         destarify(string);
  991.         strcpy(autodoc.notes, StarBufferPtr);
  992.         FreeVec(StarBufferPtr);
  993.  
  994.         // bugs
  995.         parse("\n*\n*   SEE ALSO\n*   ");
  996.         destarify(string);
  997.         strcpy(autodoc.bugs, StarBufferPtr);
  998.         FreeVec(StarBufferPtr);
  999.  
  1000.         // see also
  1001.         parse("\n*\n*****************************************************************************\n*\n*" "/" "\n");
  1002.         destarify(string);
  1003.         strcpy(autodoc.seealso, StarBufferPtr);
  1004.         FreeVec(StarBufferPtr);
  1005. }   }
  1006.  
  1007. AGLOBAL void autodoc_loop(ULONG gid)
  1008. {   STRPTR stringptr;
  1009.  
  1010.     switch(gid)
  1011.     {
  1012.     case GID_4_ST1:
  1013.         if (!(GetAttr
  1014.         (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST1], (ULONG *) &stringptr
  1015.         )))
  1016.         {   rq("Unsupported inquiry!"); // should never happen
  1017.         }
  1018.         strcpy(autodoc.library, stringptr);
  1019.     break;
  1020.     case GID_4_ST2:
  1021.         if (!(GetAttr
  1022.         (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST2], (ULONG *) &stringptr
  1023.         )))
  1024.         {   rq("Unsupported inquiry!"); // should never happen
  1025.         }
  1026.         strcpy(autodoc.funcname, stringptr);
  1027.     break;
  1028.     case GID_4_ST3:
  1029.         if (!(GetAttr
  1030.         (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST3], (ULONG *) &stringptr
  1031.         )))
  1032.         {   rq("Unsupported inquiry!"); // should never happen
  1033.         }
  1034.         strcpy(autodoc.description, stringptr);
  1035.     break;
  1036.     case GID_4_IN1:
  1037.         if (!(GetAttr
  1038.         (   INTEGER_Number, autodoc_gadgets[GID_4_IN1], (ULONG *) &autodoc.version
  1039.         )))
  1040.         {   rq("Unsupported inquiry!"); // should never happen
  1041.         }
  1042.     break;
  1043.     case GID_4_BU1:
  1044.         readautodocgadgets();
  1045.         numberofinputs();
  1046.         page = 42;
  1047.     break;
  1048.     case GID_4_BU3:
  1049.         readautodocgadgets();
  1050.         page = 41;
  1051.     break;
  1052.     default:
  1053.         if (gid >= GID_4_ST4 && gid <= GID_4_ST4 + 8)
  1054.         {   if (!(GetAttr
  1055.             (   STRINGA_TextVal, autodoc_gadgets[gid], (ULONG *) &stringptr
  1056.             )))
  1057.             {   rq("Unsupported inquiry!"); // should never happen
  1058.             }
  1059.             strcpy(autodoc.var[gid - GID_4_ST4].type, stringptr);
  1060.         } elif (gid >= GID_4_ST13 && gid <= GID_4_ST13 + 8)
  1061.         {   if (!(GetAttr
  1062.             (   STRINGA_TextVal, autodoc_gadgets[gid], (ULONG *) &stringptr
  1063.             )))
  1064.             {   rq("Unsupported inquiry!"); // should never happen
  1065.             }
  1066.             strcpy(autodoc.var[gid - GID_4_ST13].name, stringptr);
  1067.         } elif (gid >= GID_4_ST22 && gid <= GID_4_ST22 + 8)
  1068.         {   if (!(GetAttr
  1069.             (   STRINGA_TextVal, autodoc_gadgets[gid], (ULONG *) &stringptr
  1070.             )))
  1071.             {   rq("Unsupported inquiry!"); // should never happen
  1072.             }
  1073.             strcpy(autodoc.var[gid - GID_4_ST22].reg, stringptr);
  1074.         }
  1075.         break;
  1076. }   }
  1077.  
  1078. MODULE void updateautodocgadgets(void)
  1079. {   ULONG i;
  1080.  
  1081. if (page == 41)
  1082. {   SetGadgetAttrs
  1083.     (   autodoc_gadgets[GID_4_ST1], MainWindowPtr, NULL,
  1084.         STRINGA_TextVal, autodoc.library,
  1085.         TAG_END
  1086.     );
  1087.     SetGadgetAttrs
  1088.     (   autodoc_gadgets[GID_4_ST2], MainWindowPtr, NULL,
  1089.         STRINGA_TextVal, autodoc.funcname,
  1090.         TAG_END
  1091.     );
  1092.     SetGadgetAttrs
  1093.     (   autodoc_gadgets[GID_4_ST3], MainWindowPtr, NULL,
  1094.         STRINGA_TextVal, autodoc.description,
  1095.         TAG_END
  1096.     );
  1097.     SetGadgetAttrs
  1098.     (   autodoc_gadgets[GID_4_IN1], MainWindowPtr, NULL,
  1099.         INTEGER_Number, autodoc.version,
  1100.         TAG_END
  1101.     );
  1102.  
  1103.     for (i = 0; i <= 8; i++)
  1104.     {   SetGadgetAttrs
  1105.         (   autodoc_gadgets[GID_4_ST4 + i], MainWindowPtr, NULL,
  1106.             STRINGA_TextVal, autodoc.var[i].type,
  1107.             TAG_END
  1108.         );
  1109.         SetGadgetAttrs
  1110.         (   autodoc_gadgets[GID_4_ST13 + i], MainWindowPtr, NULL,
  1111.             STRINGA_TextVal, autodoc.var[i].name,
  1112.             TAG_END
  1113.         );
  1114.         SetGadgetAttrs
  1115.         (   autodoc_gadgets[GID_4_ST22 + i], MainWindowPtr, NULL,
  1116.             STRINGA_TextVal, autodoc.var[i].reg,
  1117.             TAG_END
  1118.         );
  1119. }   }
  1120. else
  1121. {   ; /* assert(page == 42);
  1122.     This should never be called, because New and Open... are only
  1123.     available from page 41. */
  1124. }
  1125. }
  1126.  
  1127. MODULE void readautodocgadgets(void)
  1128. {   ULONG  i;
  1129.     STRPTR stringptr;
  1130.     STRPTR textBuffer[MAXELEMENTS_4 + 1];
  1131.  
  1132. if (page == 41)
  1133. {   if (!(GetAttr
  1134.     (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST1], (ULONG *) &stringptr
  1135.     )))
  1136.     {   rq("Unsupported inquiry!"); // should never happen
  1137.     }
  1138.     strcpy(autodoc.library, stringptr);
  1139.  
  1140.     if (!(GetAttr
  1141.     (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST2], (ULONG *) &stringptr
  1142.     )))
  1143.     {   rq("Unsupported inquiry!"); // should never happen
  1144.     }
  1145.     strcpy(autodoc.funcname, stringptr);
  1146.  
  1147.     if (!(GetAttr
  1148.     (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST3], (ULONG *) &stringptr
  1149.     )))
  1150.     {   rq("Unsupported inquiry!"); // should never happen
  1151.     }
  1152.     strcpy(autodoc.description, stringptr);
  1153.  
  1154.     if (!(GetAttr
  1155.     (   INTEGER_Number, autodoc_gadgets[GID_4_IN1], (ULONG *) &autodoc.version
  1156.     )))
  1157.     {   rq("Unsupported inquiry!"); // should never happen
  1158.     }
  1159.  
  1160.     for (i = 0; i <= 8; i++)
  1161.     {   if (!(GetAttr
  1162.         (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST4 + i], (ULONG *) &stringptr
  1163.         )))
  1164.         {   rq("Unsupported inquiry!"); // should never happen
  1165.         }
  1166.         strcpy(autodoc.var[i].type, stringptr);
  1167.  
  1168.         if (!(GetAttr
  1169.         (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST13 + i], (ULONG *) &stringptr
  1170.         )))
  1171.         {   rq("Unsupported inquiry!"); // should never happen
  1172.         }
  1173.         strcpy(autodoc.var[i].name, stringptr);
  1174.  
  1175.         if (!(GetAttr
  1176.         (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST22 + i], (ULONG *) &stringptr
  1177.         )))
  1178.         {   rq("Unsupported inquiry!"); // should never happen
  1179.         }
  1180.         strcpy(autodoc.var[i].reg, stringptr);
  1181. }   }
  1182. else
  1183. {   // assert(page == 42);
  1184.     for (i = 0; i <= elements; i++)
  1185.     {   textBuffer[i] = (STRPTR) DoGadgetMethod(autodoc_gadgets[GID_4_TE1 + i], MainWindowPtr, NULL, GM_TEXTEDITOR_ExportText, NULL);
  1186.     }
  1187.     strcpy(autodoc.function, textBuffer[0]);
  1188.     if (inputs)
  1189.     {   for (i = 1; i <= inputs; i++)
  1190.         {   strcpy(autodoc.var[i].desc, textBuffer[i]);
  1191.     }   }
  1192.     if (returncode)
  1193.     {   strcpy(autodoc.var[0].desc, textBuffer[inputs + 1]);
  1194.     }
  1195.     strcpy(autodoc.example, textBuffer[inputs + returncode + 1]);
  1196.     strcpy(autodoc.notes,   textBuffer[inputs + returncode + 2]);
  1197.     strcpy(autodoc.bugs,    textBuffer[inputs + returncode + 3]);
  1198.     strcpy(autodoc.seealso, textBuffer[inputs + returncode + 4]);
  1199.     for (i = 0; i <= elements; i++)
  1200.     {   FreeVec((APTR) textBuffer[i]);
  1201.         textBuffer[i] = NULL;
  1202. }   }
  1203. }
  1204.  
  1205. MODULE void starify(STRPTR buffer)
  1206. {   ULONG i, inputlength = 0, outputlength = 0, outputpos = 0;
  1207.     ABOOL done = FALSE;
  1208.  
  1209.     // first we count the number of LFs in the source buffer, and the
  1210.     // length of the source buffer.
  1211.     while (!done)
  1212.     {   if (*(buffer + inputlength) == LF)
  1213.             outputlength += 4;
  1214.         elif (*(buffer + inputlength) == 0)
  1215.             done = TRUE;
  1216.         outputlength++;
  1217.         inputlength++;
  1218.     }
  1219.  
  1220.     // now we allocate the buffer
  1221.     if (!(StarBufferPtr = AllocVec(outputlength, MEMF_PUBLIC)))
  1222.         rq("Out of memory!");
  1223.  
  1224.     // now we translate into new buffer
  1225.     for (i = 0; i <= inputlength; i++)
  1226.     {   *(StarBufferPtr + outputpos) = *(buffer + i);
  1227.         if (*(buffer + i) == LF)
  1228.         {   *(StarBufferPtr + outputpos + 1) = '*';
  1229.             *(StarBufferPtr + outputpos + 2) = ' ';
  1230.             *(StarBufferPtr + outputpos + 3) = ' ';
  1231.             *(StarBufferPtr + outputpos + 4) = ' ';
  1232.             outputpos += 4;
  1233.         }
  1234.         outputpos++;
  1235. }   }
  1236. MODULE void destarify(STRPTR buffer)
  1237. {   ULONG i, inputlength = 0, outputlength = 0, outputpos = 0;
  1238.     ABOOL done = FALSE;
  1239.  
  1240.     // Translates occurrences of "\n*   " to " ".
  1241.     while (!done) // first pass
  1242.     {   if (!strncmp(buffer + inputlength, "\n*   ", 5))
  1243.             outputlength -= 4; // we replace 5 bytes with 1, saving 4 bytes
  1244.         elif (*(buffer + inputlength) == 0)
  1245.             done = TRUE;
  1246.         outputlength++;
  1247.         inputlength++;
  1248.     }
  1249.  
  1250.     // now we allocate the buffer
  1251.     if (!(StarBufferPtr = AllocVec(outputlength, MEMF_PUBLIC)))
  1252.         rq("Out of memory!");
  1253.  
  1254.     // now we translate into new buffer
  1255.     for (i = 0; i <= inputlength; i++) // second pass
  1256.     {   if (!strncmp(buffer + i, "\n*   ", 5))
  1257.         {   // currently we are at the LF.
  1258.             *(StarBufferPtr + outputpos) = ' ';
  1259.             i += 4; // plus the usual 1 incremented by the loop
  1260.         } else
  1261.         {   *(StarBufferPtr + outputpos) = *(buffer + i);
  1262.         }
  1263.         outputpos++;
  1264. }   }
  1265.  
  1266. AGLOBAL ULONG Hook4Func(struct Hook *h, VOID *o, VOID *msg)
  1267. {   /* "When the hook is called, the data argument points to the
  1268.     window object and message argument to the IntuiMessage." */
  1269.  
  1270.     UWORD code, qual;
  1271.  
  1272.     geta4(); // wait till here before doing anything
  1273.     code = ((struct IntuiMessage *) msg)->Code;
  1274.     qual = ((struct IntuiMessage *) msg)->Qualifier;
  1275.     switch(code)
  1276.     {
  1277.     case SCAN_HELP:
  1278.         helpabout();
  1279.     break;
  1280.     case SCAN_ESCAPE:
  1281.         if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT))
  1282.         {   cleanexit(EXIT_SUCCESS);
  1283.         } else
  1284.         {   page = 0;
  1285.         }
  1286.     break;
  1287.     case SCAN_B:
  1288.         if (page == 42)
  1289.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1 + inputs + returncode + 3]);
  1290.         }
  1291.     break;
  1292.     case SCAN_D:
  1293.         if (page == 41)
  1294.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_ST3]);
  1295.         }
  1296.     break;
  1297.     case SCAN_E:
  1298.         if (page == 42)
  1299.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1 + inputs + returncode + 1]);
  1300.         }
  1301.     break;
  1302.     case SCAN_F:
  1303.         if (page == 42)
  1304.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1]);
  1305.         }
  1306.     break;
  1307.     case SCAN_N:
  1308.         if (page == 41)
  1309.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_ST2]);
  1310.         } else
  1311.         {   // assert(page == 42);
  1312.             ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1 + inputs + returncode + 2]);
  1313.         }
  1314.     break;
  1315.     case SCAN_T:
  1316.         if (page == 41)
  1317.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_ST1]);
  1318.         }
  1319.     break;
  1320.     case SCAN_R:
  1321.         if (page == 41)
  1322.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_ST4]);
  1323.         } else
  1324.         {   // assert(page == 42);
  1325.             if (returncode)
  1326.             {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1 + inputs + 1]);
  1327.         }   }
  1328.     break;
  1329.     case SCAN_S:
  1330.         if (page == 42)
  1331.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1 + inputs + returncode + 4]);
  1332.         }
  1333.     break;
  1334.     case SCAN_V:
  1335.         if (page == 41)
  1336.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_IN1]);
  1337.         }
  1338.     break;
  1339.     default:
  1340.         if (page == 41 && code >= SCAN_1 && code <= SCAN_8)
  1341.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[code - SCAN_1 + GID_4_ST5]);
  1342.         }
  1343.     break;
  1344.     }
  1345.  
  1346.     return(1);
  1347. }
  1348.  
  1349. AGLOBAL void autodoc2(void)
  1350. {   struct Hook    Hook4Struct;
  1351.     TEXT           GadTitle[MAXELEMENTS_4 + 1][VLONGFIELD + 1];
  1352.     ULONG          i, counter;
  1353.     struct TagItem tag_texteditor[4] =
  1354.     { { GA_ID,                    NULL                  }, // ti_Data filled later
  1355.       { GA_RelVerify,             TRUE                  },
  1356.       { GA_TEXTEDITOR_ExportWrap, 72,                   },
  1357.       { TAG_END,                  NULL                  },
  1358.     }, tag_subcaption[3] =
  1359.     { { LABEL_Text,               NULL                  }, // ti_Data filled later
  1360.       { LABEL_Justification,      LJ_CENTRE             },
  1361.       { TAG_END,                  NULL                  },
  1362.     }, tag_button[4] =
  1363.     { { GA_ID,                    GID_4_BU3             },
  1364.       { GA_RelVerify,             TRUE                  },
  1365.       { GA_Text,                  (ULONG) "_Other page..."},
  1366.       { TAG_END,                  NULL                  }
  1367.     }, tag_supercaption[7] =
  1368.     { { LAYOUT_Orientation,       LAYOUT_ORIENT_VERT    },
  1369.       { LAYOUT_SpaceOuter,        TRUE                  },
  1370.       { LAYOUT_VertAlignment,     LALIGN_CENTER         },
  1371.       { LAYOUT_HorizAlignment,    LALIGN_CENTER         },
  1372.       { LAYOUT_BevelStyle,        BVS_NONE              },
  1373.       { LAYOUT_AddImage,          NULL                  }, // ti_Data filled later
  1374.       { TAG_END,                  NULL                  }
  1375.     }, tag_leftlayout[36] =
  1376.     { { LAYOUT_Orientation,       LAYOUT_ORIENT_VERT    },
  1377.       { LAYOUT_SpaceOuter,        TRUE                  },
  1378.       { LAYOUT_DeferLayout,       TRUE                  },
  1379.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1380.       { CHILD_WeightedHeight,     0                     },
  1381.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1382.       { CHILD_MinHeight,          40                    },
  1383.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1384.       { CHILD_WeightedHeight,     0                     },
  1385.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1386.       { CHILD_MinHeight,          40                    },
  1387.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1388.       { CHILD_WeightedHeight,     0                     },
  1389.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1390.       { CHILD_MinHeight,          40                    },
  1391.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1392.       { CHILD_WeightedHeight,     0                     },
  1393.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1394.       { CHILD_MinHeight,          40                    },
  1395.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1396.       { CHILD_WeightedHeight,     0                     },
  1397.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1398.       { CHILD_MinHeight,          40                    },
  1399.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1400.       { CHILD_WeightedHeight,     0                     },
  1401.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1402.       { CHILD_MinHeight,          40                    },
  1403.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1404.       { CHILD_WeightedHeight,     0                     },
  1405.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1406.       { CHILD_MinHeight,          40                    },
  1407.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1408.       { CHILD_WeightedHeight,     0                     },
  1409.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1410.       { CHILD_MinHeight,          40                    },
  1411.       { TAG_END,                  NULL                  },
  1412.     }, tag_rightlayout[32] =
  1413.     { { LAYOUT_Orientation,       LAYOUT_ORIENT_VERT    },
  1414.       { LAYOUT_SpaceOuter,        TRUE                  },
  1415.       { LAYOUT_DeferLayout,       TRUE                  },
  1416.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1417.       { CHILD_WeightedHeight,     0                     },
  1418.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1419.       { CHILD_MinHeight,          48                    },
  1420.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1421.       { CHILD_WeightedHeight,     0                     },
  1422.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1423.       { CHILD_MinHeight,          48                    },
  1424.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1425.       { CHILD_WeightedHeight,     0                     },
  1426.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1427.       { CHILD_MinHeight,          48                    },
  1428.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1429.       { CHILD_WeightedHeight,     0                     },
  1430.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1431.       { CHILD_MinHeight,          48                    },
  1432.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1433.       { CHILD_WeightedHeight,     0                     },
  1434.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1435.       { CHILD_MinHeight,          48                    },
  1436.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1437.       { CHILD_WeightedHeight,     0                     },
  1438.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1439.       { CHILD_MinHeight,          48                    },
  1440.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1441.       { CHILD_WeightedHeight,     0                     },
  1442.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1443.       { CHILD_MinHeight,          48                    },
  1444.       { TAG_END,                  NULL                  },
  1445.     }, tag_bothlayout[8] =
  1446.     { { LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ   },
  1447.       { LAYOUT_SpaceOuter,     TRUE                  },
  1448.       { LAYOUT_DeferLayout,    TRUE                  },
  1449.       { LAYOUT_AddChild,       NULL                  }, // ti_Data filled later
  1450.       { CHILD_WeightedWidth,   50                    },
  1451.       { LAYOUT_AddChild,       NULL                  }, // ti_Data filled later
  1452.       { CHILD_WeightedWidth,   50                    },
  1453.       { TAG_END,               NULL                  }
  1454.     }, tag_rootlayout[7] =
  1455.     { { LAYOUT_Orientation,    LAYOUT_ORIENT_VERT    },
  1456.       { LAYOUT_SpaceOuter,     TRUE                  },
  1457.       { LAYOUT_DeferLayout,    TRUE                  },
  1458.       { LAYOUT_AddChild,       NULL                  }, // ti_Data filled later
  1459.       { LAYOUT_AddChild,       NULL                  }, // ti_Data filled later
  1460.       { CHILD_WeightedHeight,  0                     },
  1461.       { TAG_END,               NULL                  }
  1462.     }, tag_window[15] =
  1463.     { { WA_PubScreen,          NULL                  }, // ti_Data filled later
  1464.       { WA_ScreenTitle,        (ULONG) "Report+"                               },
  1465.       { WA_Title,              (ULONG) "Report+: Autodoc Editor (Page 2 of 2)" },
  1466.       { WA_Activate,           TRUE                  },
  1467.       { WA_DepthGadget,        TRUE                  },
  1468.       { WA_DragBar,            TRUE                  },
  1469.       { WA_CloseGadget,        TRUE                  },
  1470.       { WA_SizeGadget,         TRUE                  },
  1471.       { WA_IDCMP,              IDCMP_RAWKEY          },
  1472.       { WINDOW_IDCMPHook,      NULL                  }, // ti_Data filled later
  1473.       { WINDOW_IDCMPHookBits,  IDCMP_RAWKEY          },
  1474.       { WINDOW_MenuStrip,      NULL                  }, // ti_Data filled later
  1475.       { WINDOW_Position,       WPOS_CENTERSCREEN     },
  1476.       { WINDOW_ParentGroup,    NULL                  }, // ti_Data filled later
  1477.       { TAG_END,               NULL                  }
  1478.     };
  1479.  
  1480.     strcpy(GadTitle[0], "_Function:");
  1481.     if (inputs)
  1482.     {   for (i = 1; i <= inputs; i++)
  1483.         {   strcpy(GadTitle[i], autodoc.var[i].name);
  1484.             strcat(GadTitle[i], ":");
  1485.     }   }
  1486.     if (returncode)
  1487.     {   strcpy(GadTitle[inputs + 1], "_Result:");
  1488.     }
  1489.     strcpy(GadTitle[inputs + 1 + returncode], "_Example:");
  1490.     strcpy(GadTitle[inputs + 2 + returncode], "_Notes:");
  1491.     strcpy(GadTitle[inputs + 3 + returncode], "_Bugs:");
  1492.     strcpy(GadTitle[inputs + 4 + returncode], "_See Also:");
  1493.  
  1494.     /* window
  1495.         root-layout
  1496.          both-layout
  1497.           left-layout
  1498.            super-caption
  1499.             sub-caption
  1500.            texteditor
  1501.           right-layout
  1502.            super-caption
  1503.             sub-caption
  1504.            texteditor
  1505.          button
  1506.          button */
  1507.  
  1508.     counter = 3;
  1509.     for (i = 0; i <= elements / 2; i++)
  1510.     {   tag_subcaption[0].ti_Data          = (ULONG) GadTitle[i];
  1511.         tag_texteditor[0].ti_Data          = GID_4_TE1 + i;
  1512.         tag_supercaption[5].ti_Data        = (ULONG) NewObjectA(LABEL_GetClass(),      NULL, tag_subcaption);
  1513.         tag_leftlayout[counter].ti_Data    = (ULONG) NewObjectA(LAYOUT_GetClass(),     NULL, tag_supercaption);
  1514.         counter += 2;
  1515.         tag_leftlayout[counter].ti_Data    =
  1516.         autodoc_gadgets[GID_4_TE1 + i]     = (ULONG) NewObjectA(TEXTEDITOR_GetClass(), NULL, tag_texteditor);
  1517.         counter += 2;
  1518.     }
  1519.     tag_leftlayout[counter].ti_Tag         = TAG_END;
  1520.     counter = 3;
  1521.     for (i = (elements / 2) + 1; i <= elements; i++)
  1522.     {   tag_subcaption[0].ti_Data          = (ULONG) GadTitle[i];
  1523.         tag_texteditor[0].ti_Data          = GID_4_TE1 + i;
  1524.         tag_supercaption[5].ti_Data        = (ULONG) NewObjectA(LABEL_GetClass(),      NULL, tag_subcaption);
  1525.         tag_rightlayout[counter].ti_Data   = (ULONG) NewObjectA(LAYOUT_GetClass(),     NULL, tag_supercaption);
  1526.         counter += 2;
  1527.         tag_rightlayout[counter].ti_Data   =
  1528.         autodoc_gadgets[GID_4_TE1 + i]     = (ULONG) NewObjectA(TEXTEDITOR_GetClass(), NULL, tag_texteditor);
  1529.         counter += 2;
  1530.     }
  1531.     tag_rightlayout[counter].ti_Tag        = TAG_END;
  1532.  
  1533.     tag_bothlayout[3].ti_Data   = (ULONG) NewObjectA(LAYOUT_GetClass(), NULL,            tag_leftlayout);
  1534.     tag_bothlayout[5].ti_Data   = (ULONG) NewObjectA(LAYOUT_GetClass(), NULL,            tag_rightlayout);
  1535.     tag_rootlayout[3].ti_Data   = (ULONG) NewObjectA(LAYOUT_GetClass(), NULL,            tag_bothlayout);
  1536.     tag_rootlayout[4].ti_Data   =
  1537.     autodoc_gadgets[GID_4_BU3]  = (ULONG) NewObjectA(NULL,              "button.gadget", tag_button);
  1538.     tag_window[13].ti_Data      =
  1539.     autodoc_gadgets[GID_4_LY2]  = (ULONG) NewObjectA(LAYOUT_GetClass(), NULL,            tag_rootlayout);
  1540.  
  1541.     InitHook(&Hook4Struct, Hook4Func, NULL);
  1542.     tag_window[9].ti_Data       = &Hook4Struct;
  1543.     lockscreen();
  1544.     tag_window[0].ti_Data       = (ULONG) ScreenPtr;
  1545.     tag_window[11].ti_Data      = MenuPtr;
  1546.  
  1547.     WinObject[4]                = (ULONG) NewObjectA(WINDOW_GetClass(), NULL,             tag_window);
  1548.     unlockscreen();
  1549.     if (!WinObject[4]) // Object creation successful?
  1550.     {   rq("Can't create ReAction objects!");
  1551.     }
  1552.     openwindow();
  1553.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVE,   NOSUB));
  1554.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVEAS, NOSUB));
  1555.     /* New and Open... are not permitted from pages 14 and 42, since the
  1556.        opened document might need a different number of text editor
  1557.        gadgets. */
  1558.  
  1559.     // Do any necessary imports.
  1560.     SetGadgetAttrs
  1561.     (   autodoc_gadgets[GID_4_TE1], MainWindowPtr, NULL,
  1562.         GA_TEXTEDITOR_Contents,     autodoc.function
  1563.     );
  1564.     if (inputs)
  1565.     {   for (i = 1; i <= inputs; i++)
  1566.         {   SetGadgetAttrs
  1567.             (   autodoc_gadgets[GID_4_TE1 + i], MainWindowPtr, NULL,
  1568.                 GA_TEXTEDITOR_Contents, autodoc.var[i].desc
  1569.             );
  1570.     }   }
  1571.     if (returncode)
  1572.     {   SetGadgetAttrs
  1573.         (   autodoc_gadgets[GID_4_TE1 + inputs + 1], MainWindowPtr, NULL,
  1574.             GA_TEXTEDITOR_Contents, autodoc.var[0].desc
  1575.         ); // return code
  1576.     }
  1577.     SetGadgetAttrs
  1578.     (   autodoc_gadgets[GID_4_TE1 + inputs + returncode + 1], MainWindowPtr, NULL,
  1579.         GA_TEXTEDITOR_Contents, autodoc.example
  1580.     );
  1581.     SetGadgetAttrs
  1582.     (   autodoc_gadgets[GID_4_TE1 + inputs + returncode + 2], MainWindowPtr, NULL,
  1583.         GA_TEXTEDITOR_Contents, autodoc.notes
  1584.     );
  1585.     SetGadgetAttrs
  1586.     (   autodoc_gadgets[GID_4_TE1 + inputs + returncode + 3], MainWindowPtr, NULL,
  1587.         GA_TEXTEDITOR_Contents, autodoc.bugs
  1588.     );
  1589.     SetGadgetAttrs
  1590.     (   autodoc_gadgets[GID_4_TE1 + inputs + returncode + 4], MainWindowPtr, NULL,
  1591.         GA_TEXTEDITOR_Contents, autodoc.seealso
  1592.     );
  1593.  
  1594.     ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1]);
  1595.     loop();
  1596.     closewindow();
  1597. }
  1598.  
  1599. MODULE ULONG parseeither(STRPTR terminator1, STRPTR terminator2)
  1600. {   ULONG dest = 0; // index in destination string
  1601.  
  1602. /* When this returns, offset points just past the end of the terminator
  1603. string. string contains what was found before the terminator string. */
  1604.  
  1605.     while (1)
  1606.     {   if (IOBuffer[offset] != CR)
  1607.         {   string[dest] = IOBuffer[offset];
  1608.         }
  1609.         if (!strncmp(&IOBuffer[offset], terminator1, strlen(terminator1)))
  1610.         {   string[dest] = 0;
  1611.             offset += strlen(terminator1);
  1612.             return(1);
  1613.         } elif (!strncmp(&IOBuffer[offset], terminator2, strlen(terminator2)))
  1614.         {   string[dest] = 0;
  1615.             offset += strlen(terminator2);
  1616.             return(2);
  1617.         } elif (offset > strlen(IOBuffer)) // we are past the end of the buffer
  1618.         {   string[0] = 0;
  1619.             return(0);
  1620.         } else
  1621.         {   offset++;
  1622.             if (IOBuffer[offset] != CR)
  1623.             {   dest++;
  1624. }   }   }   }
  1625.  
  1626. MODULE void numberofinputs(void)
  1627. {   ULONG i;
  1628.  
  1629.     if (autodoc.var[0].name[0])
  1630.         returncode = 1; // non-boolean as it's used mathematically
  1631.     else returncode = 0;
  1632.  
  1633.     inputs = 0;
  1634.     for (i = 1; i <= 8; i++)
  1635.     {   if (autodoc.var[i].name[0])
  1636.             inputs++;
  1637.         else break;
  1638.     }
  1639.     elements = inputs + 4 + returncode;
  1640. }
  1641.